#ifndef ____Variable__
#define ____Variable__

/*!
 * \file : Variable.h
 * \brief : Déclaration des méthodes sur les variables
 * \author AMMAR Inès (Responsable), CARBONNEL Jessie (Relecture)
 * \version 1.0
 * \date 22 février 2013
*/

#include <iostream>
#include <vector>

/*!
 * \class Variable
 * \brief Classe sur les variables.
*/ 
class Variable{
    
private:
    std::string name; /*!< Le nom de la Variable*/
    std::vector<std::string> values; /*!< Vecteur de valeurs de la Variable*/

public:
	
	/*!
	 * \fn Variable()
	 * \brief Constructeur par défaut d'une Variable.
	 * \return Renvoie une Variable par défaut.
	 */	
    Variable();

	/*!
	 * \fn Variable(string n)
	 * \brief Constructeur paramétré d'une Variable.
	 * \param n le nom de la Variable.
	 * \return Renvoie une Variable paramétré par son nom, sans valeurs.
	 */	
    Variable(std::string);
	
	/*!
	 * \fn Variable(string n,int nb,...)
	 * \brief Constructeur paramétré d'une Variable.
	 * \param n le nom de la Variable.
	 * \param nb le nombre de valeurs que l'on compte passer en paramètre.
	 * \return Renvoie une Variable paramétré par son nom et nb valeurs.
	 */	
    Variable(std::string,int,...);
	
	/*!
	 * \fn string getName()
	 * \brief Permet d'obtenir le nom de la Variable.
	 * \return Renvoie le nom de la Variable.
	 */	
    std::string getName()const; 
	
	/*!
	 * \fn vector<string> getValues()
	 * \brief Permet d'obtenir les valeurs du domaine.
	 * \return Renvoie un vecteur contenant les valeurs du domaine de la Variable.
	 */	
    std::vector<std::string> getValues()const;
	
	/*!
	 * \fn string getValue(int i)
	 * \brief Permet d'obtenir la ième valeur du domaine.
	 * \return Renvoie la ième valeur du domaine.
	 */	
	std::string getValue(int i)const;
	
	/*!
	 * \fn void addValue(string v)
	 * \brief Permet d'ajouter une valeur au domaine.
	 * \param v le nom d'une valeur.
	 * \return Ne renvoie rien.
	 */	
	void addValue(std::string v);
	
	/*!
	 * \fn void eraseValue(string v)
	 * \brief Permet d'enlever une valeur du domaine.
	 * \param v le nom d'une valeur.
	 * \return 0 si l'element a été supprimé, 1 sinon.
	 */	
	int eraseValue(std::string v);
	
	/*!
	 * \fn int getNumberOfValues()
	 * \brief Permet d'obtenir le nombre de valeurs du domaine.
	 * \return Renvoie le nombre de valeurs du domaine de la variable.
	 */	
    int getNumberOfValues()const;
	
	/*!
	 * \fn void show()
	 * \brief Permet d'afficher la Variable.
	 * \return Ne renvoie rien.
	 */	
    void show()const;

	/*!
	 * \fn int isPresent(string)
	 * \brief Permet de savoir si un élément est dans les valeurs et donne son emplacement.
	 * \param s l'élément à rechercher.
	 * \return -1 si l'élément n'est pas dans les valeurs, sa position sinon.
	 */	
	int isPresent(std::string);

};



#endif /* defined(____Variable__) */
